﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Itegracion.Framework.Forms;
using Itegracion.Framework.Tool;
using System.IO;
using System.Text.RegularExpressions;
using NVelocity;
using NVelocity.App;

namespace Itegracion.iAlmacen.Forms
{
    public partial class ucVenta : ucDocumento
    {
        public ucVenta()
        {
            InitializeComponent();
            dgvItems.Columns["Unidad"].ReadOnly = true;
            dgvItems.Columns["precio_unitario"].ReadOnly = false;
            dgvItems.Columns["Vencimiento"].ReadOnly = true;
            dgvItems.Columns["NroLote"].ReadOnly = true;
            idTipoEntidad = "1";
        }

        #region Metodos
        public override void OnLoadData()
        {
            idsTipo = Configuration[13];
            base.OnLoadData();
        }
        public override void OnAddItem()
        {
            fmCatalogo fm = new fmCatalogo();
            if (fm.ShowDialog() == DialogResult.OK)
            {
                if (fm.TieneStock)
                {
                    (dgvItems.DataSource as DataTable).Rows.Add(
                        dgvItems.Rows.Count + 1, //#
                        1, //Cantidad
                        fm.IdUnidad,
                        fm.IdProducto,
                        fm.Producto,
                        fm.PrecioUnitario,
                        0, //SubTotal
                        fm.Vencimiento, //Vencimiento
                        fm.NroLote, // Lote
                        fm.IdMarca,//Laboratorio
                        0,//Peso
                        fm.Codigo
                    );
                    dgvItems.Focus();
                    dgvItems.CurrentCell = dgvItems["cantidad", dgvItems.Rows.Count - 1];
                }
                else {
                    MessageBox.Show("El Producto seleccionado no tiene Stock actual.\nNO se puede realizar su venta.", "Alerta de Stock", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
        }
        public override void OnNew()
        {
            base.OnNew();
            cbTipo_SelectedIndexChanged(this, null);
        }
        public override bool AreDataValid(ModoMantenimiento modo)
        {
            if (!Regex.IsMatch(tbSerie.Text, @"^[0-9]+$"))
                return Error(tbSerie, "Por favor, Ingrese una Serie del Documento. Ejemplo: 0001");
            if (!Regex.IsMatch(tbNumero.Text, @"^[0-9]+$"))
                return Error(tbNumero, "Por favor, Ingrese un Numero del Documento. Ejemplo: 0000000001");
            if (!Regex.IsMatch(tbDocId.Text, @"^(|[0-9]{8}|[0-9]{11})$"))
                return Error(tbDocId, "Por favor, Ingrese un Documento de Identidad. Ejemplo: 23345465 (para DNI) o 10243445653 (para RUC)");
            if (!Regex.IsMatch(tbNombre.Text, @"^(|[a-zA-Z., ]+)$"))
                return Error(tbNombre, "Por favor, Ingrese un nombre valido. Ejemplo: Distribuciones Alpha S.A.C.");
            if (!Regex.IsMatch(tbDireccion.Text, @"^(|[0-9a-zA-Z., -]+)$"))
                return Error(tbDireccion, "Por favor, Ingrese una direccion valida. Ejemplo: Av. Ejercito 5454, Santiago");
            if (dgvItems.RowCount == 0)
                return Error(dgvItems, "Por favor, Ingrese productos al comprobante. Presione Ctrl + B");
            dgvItems.ClearSelection();
            foreach (DataGridViewRow item in dgvItems.Rows)
            {
                if (!Regex.IsMatch(item.Cells["cantidad"].Value + "", @"^[0-9.]+$") && Convert.ToDecimal(item.Cells["cantidad"].Value) <= 0)
                {
                    item.Cells["cantidad"].Selected = true;
                    return Error(dgvItems, "Por favor, Ingrese una cantidad valida mayor a 0");
                }
            }
            if (cbTipo.SelectedValue + "" == "5")
            {
                if (!Regex.IsMatch(tbPartida.Text, @"^[0-9a-zA-Z., -]+$"))
                    return Error(tbPartida, "Por favor, Ingrese una direccion valida. Ejemplo: Av. Ejercito 5454, Santiago");
                if (!Regex.IsMatch(tbLlegada.Text, @"^[0-9a-zA-Z., -]+$"))
                    return Error(tbLlegada, "Por favor, Ingrese una direccion valida. Ejemplo: Av. Ejercito 5454, Santiago");
                if (!Regex.IsMatch(tbRucTransporte.Text, @"^([0-9]{11})$"))
                    return Error(tbRucTransporte, "Por favor, Ingrese un RUC. Ejemplo: 10243445653");
                if (!Regex.IsMatch(tbNombreTransporte.Text, @"^[a-zA-Z., ]+$"))
                    return Error(tbNombreTransporte, "Por favor, Ingrese una razon social valida. Ejemplo: E.T. Carga Alpha S.A.C.");
                if (!Regex.IsMatch(tbPlaca.Text, @"^([A-Za-z]{3}[0-9]{3}|[A-Za-z]{2}[0-9]{4})$"))
                    return Error(tbPlaca, "Por favor, Ingrese una placa valida. Ejemplo: UZ4354 o AIR435");
                if (!Regex.IsMatch(tbCertificadoInscripcion.Text, @"^[0-9- ]+$"))
                    return Error(tbCertificadoInscripcion, "Por favor, Ingrese Nro de Certificado de Inscripcion valido.");
                if (!Regex.IsMatch(tbLicenciaConducir.Text, @"^[0-9A-Za-z]+$"))
                    return Error(tbLicenciaConducir, "Por favor, Ingrese Nro de Licencia de Conducir valido.");
            }

            return true;
        }
        public override void OnSave(object id, Framework.Forms.ModoMantenimiento modo)
        {
            Element rpta = new Element();
            if (modo == ModoMantenimiento.Nuevo)
            {
                int nroItems = 0;
                if (cbTipo.SelectedValue + "" == "2")
                    nroItems = Convert.ToInt32(Configuration[10]);
                if (cbTipo.SelectedValue + "" == "3")
                    nroItems = Convert.ToInt32(Configuration[11]);
                if (cbTipo.SelectedValue + "" == "5")
                    nroItems = Convert.ToInt32(Configuration[12]);

                if (dgvItems.RowCount > nroItems)
                {
                    int nroDocumentos = dgvItems.RowCount / nroItems + (dgvItems.RowCount % nroItems > 0 ? 1 : 0);
                    Element numero = new Element(tbNumero.Name, tbNumero.Text);
                    Element subTotal = new Element("subTotal", 0);
                    Element igv = new Element("igv", 0);
                    Element total = new Element("total", 0);
                    DataTable items = dgvItems.DataSource as DataTable;
                    DataTable subItems = items.Clone();
                    decimal st;
                    for (int i = 0; i < nroDocumentos; i++)
                    {
                        subItems.Rows.Clear();
                        st = 0;
                        for (int j = i * nroDocumentos; j < items.Rows.Count && j < i * nroDocumentos + nroItems; j++)
                        {
                            subItems.ImportRow(items.Rows[j]);
                            st += Convert.ToDecimal(items.Rows[j]["subTotal"]);
                        }
                        subTotal.Value = st;
                        igv.Value = st * 18 / 100;
                        total.Value = st * 118 / 100;
                        _("InsertarSalida",
                            tbID, tbSerie, numero, dtpFecha, cbTipo, cbMoneda, cbPago,
                            tbDocId, tbNombre, tbDireccion, new Element("idTipo", idTipoEntidad),
                            subTotal, igv, total, subItems,
                            dtpInicioTraslado, tbPartida, tbLlegada, cbMotivoTraslado,
                            tbComprobantePago, tbRucTransporte, tbNombreTransporte,
                            cbMarcaVehiculo, tbPlaca, tbCertificadoInscripcion, tbLicenciaConducir,
                            cbAfectaStock
                        ).Out(rpta);
                        numero.Value = ((Convert.ToInt32(numero.Value) + 1) + "").PadLeft(10, '0');
                    }
                    MessageBox.Show("Se han generado mas de un documento\nPor favor vaya a la lista e imprima uno por uno.", "Impresión", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    _("InsertarSalida",
                        tbID, tbSerie, tbNumero, dtpFecha, cbTipo, cbMoneda, cbPago,
                        tbDocId, tbNombre, tbDireccion, new Element("idTipo", idTipoEntidad),
                        tbSubTotal, tbIGV, tbTotal, dgvItems,
                        dtpInicioTraslado, tbPartida, tbLlegada, cbMotivoTraslado,
                        tbComprobantePago, tbRucTransporte, tbNombreTransporte,
                        cbMarcaVehiculo, tbPlaca, tbCertificadoInscripcion, tbLicenciaConducir,
                        cbAfectaStock
                    ).Out(rpta);

                    OnPrint();
                }
            }
        }
        public override bool OnDelete(string id, DataGridViewCell cell)
        {
            Element rpta = new Element();
            _("AnularSalida", tbID, cbAfectaStock, dgvItems)
                .Out(rpta);
            return true;
        }
        public override void OnPrint()
        {
            string rpta = string.Empty;

            if (MessageBox.Show(string.Format("Por favor, ponga la {0} Nro: {1}-{2} en la impresora", (cbTipo.SelectedItem as DataRowView).Row[1], tbSerie.Text, tbNumero.Text), "Impresión", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) == DialogResult.OK)
            {
                if (cbTipo.SelectedValue + "" == "2")
                    rpta = BoletaVenta();
                if (cbTipo.SelectedValue + "" == "3")
                    rpta = FacturaVenta();
                if (cbTipo.SelectedValue + "" == "5")
                    rpta = GuiaRemision();

                LPrinter printer = new LPrinter();
                if (!printer.Open("Itegracion")) return;
                printer.Print(rpta);
                printer.Close();
            }
        }
        #endregion

        #region Reportes
        private string BoletaVenta() 
        {
            string rpta = string.Empty;
            string template = Configuration[20];
            List<string> items = new List<string>();
            foreach (DataRow item in (dgvItems.DataSource as DataTable).Rows)
            {
                items.Add(string.Format("{0}|{1}|{2}|{3}", item["cantidad"], item["Nombre"], item["precioUnitario"], item["subTotal"]));
            }
            rpta = TextReporter.Process(template, tbNombre.Text, dtpFecha.Value, tbDireccion.Text, tbDocId.Text, items, NumberToText.Process(Convert.ToDecimal(tbTotal.Text)), tbTotal.Text);

            return rpta;
        }
        private string FacturaVenta()
        {   
            string rpta = string.Empty;
            string template = Configuration[21];
            List<string> items = new List<string>();
            foreach (DataGridViewRow item in dgvItems.Rows)
            {
                items.Add(string.Format("{0}|{1}|{2}|{3}|{4}", item.Cells["cantidad"].Value, item.Cells["Unidad"].FormattedValue, item.Cells["Nombre"].Value, item.Cells["precio_unitario"].Value, item.Cells["subTotal"].Value));
            }
            rpta = TextReporter.Process(template, tbNombre.Text, dtpFecha.Value, tbDireccion.Text, tbDocId.Text, items, NumberToText.Process(Convert.ToDecimal(tbTotal.Text)), tbSubTotal.Text, tbIGV.Text, tbTotal.Text);

            return rpta;
        }
        private string GuiaRemision()
        {
            string rpta = string.Empty;
            string template = Configuration[22];
            List<string> items = new List<string>();
            foreach (DataGridViewRow item in dgvItems.Rows)
            {
                items.Add(string.Format("{0}|{1}|{2}|{3}|{4}", item.Cells["codigo"].Value, item.Cells["nombre"].Value, item.Cells["unidad"].FormattedValue, item.Cells["cantidad"].Value, item.Cells["peso"].Value));
            }
            rpta = TextReporter.Process(template, dtpFecha.Value, dtpInicioTraslado.Value, tbPartida.Text, tbLlegada.Text, tbNombre.Text, tbPlaca.Text, tbDocId.Text, tbCertificadoInscripcion.Text, tbLicenciaConducir.Text, items, tbNombreTransporte.Text, tbRucTransporte.Text, tbComprobantePago.Text, (cbMotivoTraslado.SelectedItem as DataRowView).Row[1]);

            return rpta;
        }
        #endregion

        private void cbTipo_SelectedIndexChanged(object sender, EventArgs e)
        {   
            Element rpta = new Element();
            _("Itegracion.iAlmacen", "Documento", "TraerSerieNumeroByTipo", cbTipo)
                .Out(rpta);
            tbSerie.Text = (rpta.Value + "").Split('-')[0];
            tbNumero.Text = (rpta.Value + "").Split('-')[1];
        }
    }
}
